package cn.tedu.tea.front.server.content.schedule;

import cn.tedu.tea.front.server.content.service.ICategoryService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

/**
 * 处理类别缓存的计划任务
 *
 * @author java@tedu.cn
 * @version 1.0
 */
@Slf4j
// @Component
public class CategoryCacheSchedule {

    @Autowired
    private ICategoryService categoryService;

    public CategoryCacheSchedule() {
        log.debug("创建计划任务组件对象：CategoryCacheSchedule");
    }

    // fixedRate：执行频率，根据上一次执行的开始时间来计算下一次的执行时间，取值以毫秒为单位
    // fixedDelay：执行间隔，根据上一次执行的结束时间来计算下一次的执行时间，取值以毫秒为单位
    // cron：使用cron表达式来配置执行时间
    // -- cron表达式的本质是一个字符串，此字符串中包括6~7个域，每个域的值之间使用空格分隔
    // -- cron表达式中的域从左至右依次是：秒 分 时 日 月 周 [年]
    // -- 各域的值可以使用通配符：
    // -- 使用星号（*）表示任意值
    // -- 使用问号（?）表示不关心此值，此通配符只能用于“日”和“周”所在的域
    // -- 在各个域中，可以使用减号表示连接的区间，例如在“月”所在的域使用 5-7 表示“从5至7”
    // -- 在各个域中，可以使用英文的逗号分隔多个值，表示满足列举的任意值均可，例如在“月”所在的域使用 1,3,5,7,9 表示1月或3月或5月或7月或9月均匹配
    // -- 在各个域中，数字值可以写成“x/y”的格式，表示此域的值为x时执行，且每间隔y再次执行，直至其它域的值不满足匹配
    // -- 更多内容可参考：https://zhuanlan.zhihu.com/p/573018560
    @Scheduled(fixedRate = 2 * 60 * 1000)
    public void rebuildListCache() {
        log.debug("开始执行【重建缓存中的类别列表】的计划任务");
        categoryService.rebuildListCache();
    }

}